package com.cs.beneficios.web.action;
import com.cs.beneficios.business.entity.BeneficiarioDAO;
import com.cs.beneficios.business.entity.ErrorDAO;
import com.cs.beneficios.business.entity.VflexDAO;
import com.cs.beneficios.business.model.BeneficiarioVO;
import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;
import com.cs.paoyer.administration.business.model.UserVO;
import com.cs.paoyer.administration.util.AccessControl;
 
import java.io.IOException;

import java.sql.SQLException;

import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List; 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class RegistrarGrupoFamiliarAction extends Action 
{
  /**
   * This is the main action called from the Struts framework.
   * @param mapping The ActionMapping used to select this instance.
   * @param form The optional ActionForm bean for this request.
   * @param request The HTTP Request we are processing.
   * @param response The HTTP Response we are processing.
   * @return 
   * @throws java.io.IOException
   * @throws javax.servlet.ServletException
   */
  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
  {
    AccessControl access = new AccessControl();
    access.validateAccess(mapping,request,response);
    HttpSession session = request.getSession();
    //ConnectionFactory cf = new ConnectionFactory("beneficios","beneficios");
	ConnectionFactory cf = new ConnectionFactory();
    
    //Para la auditoria de registros
    UserVO user = (UserVO) session.getAttribute("userInfo");
    String terminalAddress = "WEB="+request.getRemoteAddr();
    Calendar c = Calendar.getInstance(); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");   
    
    Collection cGrupoFamiliarSisben = null;
    Collection cGrupoFamiliar = null;
    List lListGrupoFamiliarSisben = new LinkedList();
    List lListGrupoFamiliar = new LinkedList();
    List lListBeneficiario = new LinkedList();
    List lListBeneNoInsert = new LinkedList();
    List lListBeneInsert = new LinkedList();
    List lListParentesco = new LinkedList();
    List lListBeneSelected = new LinkedList();
    
    BeneficiarioVO objbeneVO = new BeneficiarioVO();
    BeneficiarioVO objbeneJefeVO = new BeneficiarioVO();
    BeneficiarioDAO objBeneficiarioDAO  = null;
    
    String strMaxCode = null;
    String strReturn = request.getParameter("Back");
    String strCodeBeneSelected = (String)session.getAttribute("CodeBeneSelected");
    String strInsert[] = new String[2];
    strInsert[0] = "false";
    
    boolean bContinuar = true;
    Long lnCodeMax = null;
    
    session.removeAttribute("msgerror");
    
    cGrupoFamiliarSisben = (Collection)session.getAttribute("InsertGrupoFamiliar");
    if(cGrupoFamiliarSisben != null && cGrupoFamiliarSisben.size() != 0)
    {
      for(int i=0; i<cGrupoFamiliarSisben.size(); i++)
      {
         int iError = 0;
        lListGrupoFamiliarSisben = (List)cGrupoFamiliarSisben;
        objbeneVO = (BeneficiarioVO)lListGrupoFamiliarSisben.get(i);
        objbeneVO.setCode(null);
        try
        {  
          objBeneficiarioDAO = new BeneficiarioDAO(cf);
          lListBeneficiario = (List)objBeneficiarioDAO.findBeneficiarioByCriterea(objbeneVO,"gf");
          cf.closeConnection(objBeneficiarioDAO.getConn());
          
          ErrorDAO objError = new ErrorDAO(cf);
          int iReturn = objError.InsertError("Debug","Se realizo la consulta correctamente. Nombre: "+
                        objbeneVO.getNombre1()+" linea 93");
          cf.closeConnection(objError.getConn());
        }catch(SQLException sqle)
        {
			System.err.println("/******** TDSUB - cwsub");
			sqle.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
          iError = 1;
        }
        
        if(iError == 1)
        {
          try
          {
            ErrorDAO objError = new ErrorDAO(cf);
            int iReturn = objError.InsertError("Debug","Error al buscar el beneficiario. Nombre: "+
                          objbeneVO.getNombre1()+" Fecha: "+objbeneVO.getFechaNacimiento()+" linea 93");
            cf.closeConnection(objError.getConn());            
          }catch(SQLException sqlex)
          {
			System.err.println("/******** TDSUB - cwsub");
			sqlex.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
          }
        }
        
        if(lListBeneficiario.size() == 0)
        {
          objbeneVO.setCreationUser(user.getName());
          objbeneVO.setUpdateUser(user.getName());
          objbeneVO.setCreationTerminal("WEB="+terminalAddress);
          objbeneVO.setUpdateTerminal("WEB="+terminalAddress);
          objbeneVO.setUpdateDate(dateFormat.format(c.getTime()));
          objbeneVO.setCreationDate(dateFormat.format(c.getTime()));
          try
          {
            objBeneficiarioDAO = new BeneficiarioDAO(cf);
            strInsert = objBeneficiarioDAO.ingresarBeneficiario(objbeneVO);
            cf.closeConnection(objBeneficiarioDAO.getConn());
            ErrorDAO objError = new ErrorDAO(cf);
            int iReturn = objError.InsertError("Debug","Se realizo la insercion correctamente. Nombre: "+
                          objbeneVO.getNombre1()+" linea 116");
            cf.closeConnection(objError.getConn());
          }catch (SQLException se)
          {
			System.err.println("/******** TDSUB - cwsub");
			se.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
            strInsert[0] = "false";
          }
          if(strInsert[0] == "false")
          {
            lListBeneNoInsert.add(objbeneVO);
          }else
          {
            objbeneVO.setCode(new Long(strInsert[1]));
            lListBeneInsert.add(objbeneVO);
          }
          
          if(objbeneVO.getParentesco().equals("JEFE"))
          {
            if(strInsert[0] == "false")
            {
              bContinuar = false;
              session.setAttribute("msgerror","No se puedo registrar la persona jefe de hogar: "+objbeneVO.getNombre1()+" "+objbeneVO.getNombre2()+" "+objbeneVO.getPrimerApellido()+" "+objbeneVO.getSegundoApellido());
              break;
            }else
            {
              objbeneVO.setCode(new Long(strInsert[1]));
              objbeneJefeVO = objbeneVO;
            }
          }
        }else
        {
          try
          {
            ErrorDAO objError = new ErrorDAO(cf);
            int iReturn = objError.InsertError("Debug","El beneficiario ya existe. Nombre: "+
                          objbeneVO.getNombre1()+" linea 93");
            cf.closeConnection(objError.getConn());            
          }catch(SQLException sqlex)
          {
			System.err.println("/******** TDSUB - cwsub");
			sqlex.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
          }
          
          
          BeneficiarioVO objFindBeneVO = null;
          objFindBeneVO = (BeneficiarioVO)lListBeneficiario.get(0);
          objFindBeneVO.setParentesco(objbeneVO.getParentesco());
          lListBeneInsert.add(objFindBeneVO);
          
          if(objbeneVO.getParentesco().equals("JEFE"))
          {
            objbeneJefeVO = (BeneficiarioVO)lListBeneficiario.get(0);
          }
          if(((objFindBeneVO.getCode()).toString()).equals(strCodeBeneSelected) )
          {
            lListBeneSelected.add(objFindBeneVO);
          }
        }
      }
      // Fin del proceso
      
      
      if(bContinuar)
      {
        // Proceso para verificar si el grupo familiar esta registrado
        try
        {
          objBeneficiarioDAO  = new BeneficiarioDAO(cf);
          cGrupoFamiliar = objBeneficiarioDAO.getCabezasGrupoFamiliar(objbeneJefeVO);
          cf.closeConnection(objBeneficiarioDAO.getConn());
        }catch(SQLException sqle)
        {
			System.err.println("/******** TDSUB - cwsub");
			sqle.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
        }
        
        if(cGrupoFamiliar == null || cGrupoFamiliar.size() == 0)
        {
           // Proceso para traer el codigo del parentesco
           try
           {
             VflexDAO objValorFlexDAO = new VflexDAO(cf);
             lListParentesco = (List)objValorFlexDAO.FindCodeValorFlex(objbeneJefeVO.getParentesco());
             cf.closeConnection(objValorFlexDAO.getConn());
           }catch(SQLException sqle)
           {
			System.err.println("/******** TDSUB - cwsub");
			sqle.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
           }
           
           // Fin del Proceso
           VflexVO objValorflexVO = new VflexVO();
           objValorflexVO = (VflexVO)lListParentesco.get(0);
           String inserto[] = new String[2];
           inserto[0] = "false";
           try
           {
             objBeneficiarioDAO  = new BeneficiarioDAO(cf);
             inserto = objBeneficiarioDAO.insertarGrupoFamiliar(objbeneJefeVO.getCode(),objbeneJefeVO.getNumeroDocumento(),objValorflexVO.getCode(),user.getName(),terminalAddress,dateFormat.format(c.getTime()));
             cf.closeConnection(objBeneficiarioDAO.getConn());
           }catch(SQLException sqle)
           {
			System.err.println("/******** TDSUB - cwsub");
			sqle.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
           }
           
           if(inserto[0] != "true")
           {
             bContinuar = false;
             session.setAttribute("msgerror","No se puedo crear el grupo familiar para la persona: "+objbeneVO.getNombre1()+" "+objbeneVO.getNombre2()+" "+objbeneVO.getPrimerApellido()+" "+objbeneVO.getSegundoApellido());
           }else
           {
             try
             {
               objBeneficiarioDAO = new BeneficiarioDAO(cf);
               strMaxCode = objBeneficiarioDAO.FindMaxCodeGrupoFamiliar();
               cf.closeConnection(objBeneficiarioDAO.getConn());
             }catch(SQLException sqle)
             {
				System.err.println("/******** TDSUB - cwsub");
				sqle.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
             }
             
             // obtener el maximo codigo de la tabla grupo familiar
           }
        }else
        {
          lListGrupoFamiliar = (List)cGrupoFamiliar;
          BeneficiarioVO objGrupoVO = (BeneficiarioVO)lListGrupoFamiliar.get(0);
          strMaxCode = objGrupoVO.getGrupoFamiliarCode().toString();
          // obtener el codigo del grupo familiar.
        }
        // Fin del proceso
      }
      
      if(bContinuar)
      {
        if(lListBeneInsert.size() != 0)
        {
          
          for(int i=0;i<lListBeneInsert.size();i++)
          {
            
            BeneficiarioVO objBeneficiarioVO = new BeneficiarioVO();
            objBeneficiarioVO = (BeneficiarioVO)lListBeneInsert.get(i);
            // Proceso para identificar si el beneficiario ya esta asignado al grupo familiar
            boolean bSearch = false;
            try
            {
              objBeneficiarioDAO  = new BeneficiarioDAO(cf);
              bSearch = objBeneficiarioDAO.FindBeneAssigned(objBeneficiarioVO.getCode(),strMaxCode);
              cf.closeConnection(objBeneficiarioDAO.getConn());
            }catch(SQLException sqle)
            {
				System.err.println("/******** TDSUB - cwsub");
				sqle.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
            }
            // Fin del proceso
            
            if(!bSearch)
            {
              // Proceso para traer el codigo del parentesco
              try
              {
                VflexDAO objValorFlexDAO = new VflexDAO(cf);
                lListParentesco = (List)objValorFlexDAO.FindCodeValorFlex(objBeneficiarioVO.getParentesco());
                cf.closeConnection(objValorFlexDAO.getConn());
              }catch(SQLException sqle)
              {
				System.err.println("/******** TDSUB - cwsub");
				sqle.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
              }
              
              // Fin del Proceso
              VflexVO objVflexVO = null;
              objVflexVO = new VflexVO();
              objVflexVO = (VflexVO)lListParentesco.get(0);
              
              try
              {
                objBeneficiarioDAO = new BeneficiarioDAO(cf);
                boolean bInsertOk = objBeneficiarioDAO.asignarGrupoFamiliar(objBeneficiarioVO.getCode(), new Long(strMaxCode), 
                                   objVflexVO.getCode(),user.getName(),terminalAddress,dateFormat.format(c.getTime()));
                cf.closeConnection(objBeneficiarioDAO.getConn());
              }catch(SQLException sqle)
              {
				System.err.println("/******** TDSUB - cwsub");
				sqle.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
              }
              
            }
            
          }
        }else
        {
          session.setAttribute("msgasignar","No hay beneficiarios para asignar al grupo familiar");
        }
      }
    }
    
    if(lListBeneSelected.size() != 0)
    {
      request.setAttribute("ListBeneSelected",lListBeneSelected);
    }
    if(lListBeneInsert.size() != 0)
    {
      request.setAttribute("ListBeneInsert",lListBeneInsert);
    }
    if(lListBeneNoInsert.size() != 0)
    {
      request.setAttribute("ListBeneNoInsert",lListBeneNoInsert);
    }
    if(strReturn != null)
    {
      request.setAttribute("Return",strReturn);
    }
    return mapping.findForward("success");
  }
}